using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using Magiq.Insert;
using Magiq.Behaviors;
using Magiq.Update;

namespace Magiq
{
    public interface IMagiq<T> where T : class
    {
        IUpdate<T> Set<TReturn>(Expression<Func<T, TReturn>> property, TReturn value);
        IUpdate<T> Set<TReturn>(Expression<Func<T, TReturn>> property, Expression<Func<T, TReturn>> value);
        int Delete();
        int Delete(Expression<Func<T, bool>> where);
        IInsertBuilder<TSource, T> From<TSource>(IEnumerable<TSource> source);
        IQueryable<T> Query();
        IQueryable<T> Query(Expression<Func<T, bool>> where);
        IMagiq<T> Using(IMagiqBehavior behavior);
        IMagiq<T> Using<TBehavior>() where TBehavior : IMagiqBehavior, new();
        IMagiq<T> Using<TBehavior>(Action<TBehavior> configureBehavior) where TBehavior : IMagiqBehavior, new();
    }
}